ADCSER page# 0001 next
2: COMMENT ⊗   VALID 00024 PAGES
3: C REC  PAGE   DESCRIPTION
4: C00001 00001
5: C00004 00002    BEGIN   ADCSER  ↔SUBTTL NEW AD/DA SERVICE ROUTINE
6: C00006 00003     UUO DISPATCH TABLE FOR ADC
7: C00007 00004     ADC MTAPE UUO. SETS PARAMETERS.
8: C00010 00005     ADC DUMP MODE INPUT ROUTINE
9: C00013 00006     ADC HUNG TIMEOUT, ADHUNG, ADC INITIALIZE CODE, ADCINI, ADC RELEASE, ADCREL
10: C00015 00007     ADCP2 - PDP-6'S CLK LEVEL ROUTINE FOR THE ADC
11: C00017 00008     ADCP2 CONT - STARTUP CODE, SET `RUN' FLAG, CHECK FOR IO SYNC
12: C00019 00009     ADCP1 - PDP-10'S CLOCK ROUTINES FOR THE ADC
13: C00021 00010     ADC INTERRUPT ROUTINES, ADCIST FOR SPURIOUS, ADCINT FOR NORMAL
14: C00024 00011     ADC INTERRUPT ROUTINES, ADCRCY FOR RECYCLING INPUT
15: C00025 00012     ADC INTERRUPT ROUTINES - ADCSMD, SWITCH MODES FROM CYCLE TO NORMAL
16: C00028 00013     ADC INTERRUPT ROUTINES - ADCILA, ADCW, ADCWK, ADCILI, END OF XFR
17: C00031 00014     UUO DISPATCH TABLE FOR DAC
18: C00032 00015     DAC MTAPE UUO. SETS PARAMETERS.
19: C00034 00016     DAC DUMP MODE OUTPUT ROUTINE
20: C00037 00017     DAC HUNG ROUTINE, DAHUNG, DAC INITIALIZE ROUTINE, DACINI, RELEASE, DACREL
21: C00038 00018     DACP2 - PDP-6'S CLK LEVEL ROUTINE FOR THE DAC
22: C00041 00019     DACP1 - PDP-10'S CLOCK ROUTINES FOR THE DAC
23: C00042 00020     DAC INTERRUPT ROUTINES, DACIST FOR SPURIOUS, DACINT FOR NORMAL
24: C00044 00021     DAC INTERRUPT ROUTINES - WAKEUP AND `RUN' FLAG BUSINESS
25: C00046 00022     ROUTINE MAKES UP A CONO WORD FROM MTAPE SPECS
26: C00049 00023     ADRCHK - ROUTINE TO ADDRESS CHECK AN IOWD, CHKUUO - CHECKS UUO ADDR
27: C00051 00024     END OF IT ALL
28: C00052 ENDMK
29: C⊗;
    ADCSER page# 0002 next  prev
31: BEGIN   ADCSERSUBTTL NEW AD/DA SERVICE ROUTINE
32: ;JAM 2-10-74
33: 
34: ; IOS BITS, RH
35: 
36: CYCDON←←20      ; CIRCULATION DONE
37: IOSYNC←←40      ; SYNCHRONIZE AD AND DA AT STARTUP
38: CONT←←100       ; CONTINUOUS MODE (NO WAIT AFTER DMP MODE COMMAND)
39: CYCLE←←200      ; CIRCULATE INPUT MODE
40: LOST←←2000      ; LOST. MEANS DATA MISSED.
41: IOAFT←←4000     ; IOSYNC∧CYCLE∧IOAFT ⊃ START OUTPUT AFTER
42:                 ;    RECYCLE DONE, NOT BEFORE.
43: ERRMSK←←IOIMPM!IODTER!IODERR!IOBKTL
44: 
45: ; CONO BITS
46: 
47: FILT←←200000    ; 2-BIT FILTER NUMBER GOES HERE
48: RUNB←←100000
49: MPX←←040000     ; ALTERNATE INPUT (ADC ONLY)
50: FLOAT←←040000   ; 9-BIT FLOATING INCREMENTAL MODE (DAC ONLY)
51: .16BIT←←020000  ; HALFWORD MODE (LEFT ADJUSTED)
52: .12BIT←←010000  ; COMPATIBILITY MODE
53: SPEED←←100      ; 3-BIT SPEED NUMBER GOES HERE
54: QUAD←←40
55: STEREO←←20
56: MONO←←10
57: 
58: ; CONI BITS - ADC
59: 
60: DATARQ←←40
61: BUFFUL←←20
62: ADLOST←←10
63: 
64: ; CONI BITS - DAC
65: 
66: BUFRDY←←4000
67: INTRQ←←2000
68: DALOST←←1000
69: 
70: ; CODES THAT GO IN P2 CELLS (ADCP2L, DACP2L)
71: 
72: STCODE←←1       ; STARTUP. IOWD IN XXXNBK
73: KLCODE←←2       ; CLEAR.
74: 
75: ; CODES THAT GO IN P1 CELLS (ADCP1L, DACP1L)
76: 
77: WKCODE←←1       ; WAKE UP JOB
78: ERCODE←←2       ; ERROR. (ADDRESS CHECK)
    ADCSER page# 0003 next  prev
80: ; UUO DISPATCH TABLE FOR ADC
81: 
82:         JRST ADCINI     ; SYSTEM STARTUP
83:         JRST ADHUNG     ; HUNG TIME OUT
84: ADCDSP:JRST ADCREL     ; RELEASE
85:         POPJ P,         ; CLOSE OUTPUT
86:         JRST UUOERR     ; BUFFERED OUTPUT
87:         JRST ILLINP     ; BUFFERED INPUT
88:         JRST CPOPJ1     ; ENTER
89:         JRST CPOPJ1     ; LOOKUP
90:         JRST UUOERR     ; DMP MODE OUTPUT
91:         JRST ADCIN      ; DMP MODE INPUT
92:         POPJ P,         ; USETO
93:         POPJ P,         ; USETI
94:         POPJ P,         ; UGETF
95:         JRST CPOPJ1     ; RENAME
96:         POPJ P,         ; CLOSE INPUT
97:         POPJ P,         ; UTPCLR
98:         JRST ADCMTP     ; MTAPE
    ADCSER page# 0004 next  prev
100: ; ADC MTAPE UUO. SETS PARAMETERS.
101: ; EFFECTIVE ADDRESS POINTS TO THREE WORD BLOCK
102: ; FIRST WORD (RH SAME AS DAC)
103: ;       <RECYCLE END THRESHHOLD>,,SPEED*1000+PACK*100+NCHANS
104: ;       <R.E. THRESH> IS LEFT ADJUSTED, 12 OR 16 BIT 2'S COMP NUMBER
105: ;               WHEN INPUT SAMPLE EXCEEDS THAT, WE END RECYCLING
106: ;       SPEED = 0       6.4 KC          IS PER CHANNEL RATE
107: ;               1       12.8 KC
108: ;               2       25.6 KC
109: ;               3       51.2 KC         MAX FOR ADC. DAC GOES ON UP.
110: ; SECOND WORD (SAME AS DAC)
111: ;       <ADDR FOR ERR CODES>,,<ADDR FOR `RUN' FLAG>
112: ;       <`RUN' FLAG IS `SETOM'ED WHILE ADC IS RUNNING AND ZEROED WHEN
113: ;               ADC IS SHUT OFF
114: ; THIRD WORD (NOT USED IN DAC)
115: ;       <INPUT SELECT>,,<ADDR TO PUT RECYCLE IOWD>
116: ;       <INPUT SELECT> IS CURRENTLY ONE BIT, THE SIGN BIT. MEANS `MPX'
117: ;       <ADDR . . .> IS WHERE WE PUT THE RECYCLE IOWD WHEN
118: ;               THE INPUT SAMPLE HAS EXCEEDED THE THRESHHOLD AND WE
119: ;               THUS SWITCH BUFFERS
120: 
121: ADCMTP: TLZN IOS,IOBEG          ; FIRST UUO?
122:         JRST ADCFST
123:         MOVEM IOS,ADCIOS
124:         PUSHJ P,ADCINI          ; CLEAR OUT DDB
125: ADCFST: PUSHJ P,CHKUUO          ; ADDRESS CHECK EFFECTIVE ADDR OF UUO
126:                                 ; LEAVES LAST WD OF CORE IMAGE IN AC1,
127:                                 ; RH OF UUO IN AC2
128:         ADDI AC2,2              ; DO SO WITH END OF TABLE TOO
129:         CAILE AC2,(AC1)
130:         JRST ADRERR
131:         MOVE TAC,@UUO           ; PICK UP THRESH,,PARAMS
132:         HLLZM TAC,ADCTHR        ; SET THRESHHOLD
133:         PUSHJ P,SETCNO          ; SET UP CONO WORD IN TAC1
134:         MOVEM AC2,ADCWPS        ; SAVE # WORDS PER SECOND
135:         TRNE TAC1,4*SPEED       ; IS SPEED>3
136:         JRST ILLSPD             ; YES, IS ERROR.
137:         TRNE TAC1,MPX           ; FLOAT MODE FOR ADC?
138:         JRST ILLMOD             ; IS ERROR
139:         ADDI UUO,1              ; BUMP TO ERR CODE WORD
140:         MOVE AC1,@UUO
141:         HLRZM AC1,ADCERA        ; SET ERROR CODE ADDRESS
142:         HRLI AC1,PROG           ; SET PROG IN INDEX FIELD
143:         MOVEM AC1,ADCRUN        ; RUN FLAG ADDRESS
144:         HLLM AC1,ADCERA
145:         ADDI UUO,1
146:         SKIPGE @UUO             ; IS MPX BIT ON?
147:         ORI TAC1,MPX            ; YES
148:         MOVEM TAC1,ADCCNO       ; STORE CONO WORD
149:         POPJ P,                 ; ALL DONE
    ADCSER page# 0005 next  prev
151: ; ADC DUMP MODE INPUT ROUTINE
152: 
153: ADCUW:  TRNE IOS,ERRMSK
154:         POPJ P,                 ; LEAVE ON ERRORS
155:         PUSHJ P,WSYNC           ; SINCE IOACT IS ON, WILL WAIT
156: ADCIN:  TLZN IOS,IOBEG          ; FIRST UUO?
157:         JRST ADCNFS
158:         MOVEM IOS,ADCIOS
159:         PUSHJ P,ADCINI          ; CLEAR OUT DDB
160: ADCNFS: SKIPE ADCNBK            ; IS THERE ANOTHER BLOCK?
161:         JRST ADCUW              ; YES, WAIT FOR IT TO END
162:         PUSHJ P,CHKUUO          ; ADDRESS CHECK RH OF UUO
163:         SKIPE TAC,@UUO          ; PICK UP IOWD
164:         TLNN TAC,777777         ; ANY WORD COUNT?
165:         JRST ADCXIT             ; NOTHING THERE. GO HOME.
166:         PUSHJ P,ADRCHK          ; ADDRESS CHECKS IOWD IN TAC
167:         JRST ADRERR             ; ILLEGAL. STOP JOB AND DIE
168:         MOVEI IOS,IOACT
169:         PSYNC ADCCSC
170:         ORB IOS,ADCIOS          ; LOCK US IN CORE
171:         XSYNC ADCCSC
172:         ADDI TAC,(PROG)         ; RELOCATE IT NOW
173:         MOVEM TAC,ADCNBK
174:         HLRO AC1,TAC            ; PICK UP -WC
175:         MOVN AC1,AC1            ; MAKE IT POSITIVE
176:         IDIV AC1,ADCWPS         ; GET # SECONDS
177:         ADDI AC1,5              ; A FEW EXTRA FOR GOOD MEASURE
178:         CAILE AC1,77            ; SATURATE AT 6 BITS
179:         MOVEI AC1,77
180:         DPB AC1,PDVTIM          ; MAKE THIS THE NEW HUNG TIME
181:         SKIPE ADCBKI            ; IS THERE AN XFR IN PROGRESS?
182:         JRST ADCXIT             ; YES. LEAVE NOW
183:         TRNE IOS,IOSYNC         ; ARE WE SYNCHRONIZING?
184:         SKIPE DACBKO            ; YES, IS XFR RUNNING THERE?
185:         JRST ADCSTR             ; NOT SYNC OR XFR ALREADY RUNNING ON DAC
186:         SKIPN DACNBK            ; IS THERE AN XFR QUEUED?
187:         JRST ADCSHT             ; NO, PUT US DOWN AND HANG. SET HUNG TIME.
188: ADCSTR: MOVEI TAC,STCODE        ; NO, START ADC AND LEAVE
189:         MOVEM TAC,ADCP2L        ; PLACE WHERE P2 WILL SEE IT
190: ADCXIT: TRNE IOS,CONT           ; CONTINUOUS MODE?
191:         SUB P,[XWD 1,1]         ; YES, RETURN UPLEVEL ONE
192:         POPJ P,
193: 
194: ADCSHT: MOVEI TAC,77            ; SET HUNG TIME TO MAXIMUM
195:         DPB TAC,PDVTIM
196:         JRST ADCXIT
    ADCSER page# 0006 next  prev
198: ; ADC HUNG TIMEOUT, ADHUNG, ADC INITIALIZE CODE, ADCINI, ADC RELEASE, ADCREL
199: 
200: ADHUNG: SKIPN ADCNOH            ; IF DEBUGGING, DON'T RE-INITIALIZE YET
201: ADCREL: PUSHJ P,ADCCLR
202:         MOVEI DDB,ADCDDB
203: HUNG:   MOVEI IOS,IOACT
204:         PSYNC1 <HRRZ TAC,DEVCMR(DDB)>
205:         ANDCAB IOS,DEVIOS(DDB)
206:         XSYNC1 <HRRZ TAC,DEVCMR(DDB)>
207:         TLNN IOS,IOW
208:         JRST HFTST
209:         MOVSI IOS,IOW
210:         PSYNC1 <HRRZ TAC,DEVCMR(DDB)>
211:         ANDCAB IOS,DEVIOS(DDB)
212:         XSYNC1 <HRRZ TAC,DEVCMR(DDB)>
213:         LDB J,PJOBN
214:         PUSHJ P,STTIOD          ; BRING HIM OUT OF IO WAIT
215: HFTST:  SKIPE ADCNOH            ; ARE WE IN NO-HANG (DEBUGGING) MODE?
216:         AOS (P)                 ; SKIP RETURN MEANS NO KILL
217:         POPJ P,
218: 
219: ADCCLR: MOVEI TAC,KLCODE
220:         MOVEM TAC,ADCP2L        ; TELL P2 TO CLEAR ADC
221:         JRST ADCJST
    ADCSER page# 0007 next  prev
223: ; ADCP2 - PDP-6'S CLK LEVEL ROUTINE FOR THE ADC
224: 
225: ADCP2: SKIPN TAC,ADCP2L
226:         POPJ P,                 ; SOMEBODY SCREWED UP!
227:         SETZM ADCP2L
228:         JRST @P2LDSP-1(TAC)
229: 
230: P2LDSP: ADCST           ; STARTUP
231:         ADCKL           ; KILL
232: 
233: ADCKL:  CONO ADC,0      ; THIS IS EASY ENOUGH
234: ADCINI: SETZM ADCZB
235:         MOVE TAC,[XWD ADCZB,ADCZB+1]
236:         BLT TAC,ADCZND-1
237: ADCJST: MOVEI TAC,ADCIST
238:         HRRM TAC,ADCJMP
239:         POPJ P,
240: 
241: ADCST:  MOVEI DDB,ADCDDB
242:         CONO DCB,200000         ; KILL OLD AD IF RUNNING
243:         CONO AD,4000            ; OTHERWISE, WILL LOOP IN P2CH1
244:         MOVSI TAC,(<JFCL>)
245:         HLLM TAC,ADJMP          ; KILL JUMP TO OLD AD ROUTINES
246:         MOVE TAC,[JSR ADCCHL]   ; MAKE SURE CHAN LOC IS SET UP RIGHT
247:         MOVEM TAC,40+<ADCCHN*2>
248:         CONO PI,ADCON
249:         SKIPN TAC,ADCNBK
250:         JRST ADCKL
251:         LDB TAC1,PDVTIM         ; SET TIME COUNT
252:         DPB TAC1,PDVCNT
253:         MOVEM TAC,ADCBKI
254:         SETZM ADCNBK
255:         MOVEI TAC1,ADCINT       ; PRETEND IT IS A NORMAL INTERRUPT
256:         MOVE IOS,ADCIOS
257:         TRNE IOS,CYCLE
258:         TRNE IOS,CYCDON
259:         JRST ADCSCN
260:         MOVEI TAC1,ADCRCY       ; SET TO RECYCLE
261:         MOVEM TAC,ADCRCB        ; STORE IOWD HERE ALSO FOR RECYCLING
262: ADCSCN: HRRM TAC1,ADCJMP        ; SET JUMP LOCATION
    ADCSER page# 0008 next  prev
264: ; ADCP2 CONT - STARTUP CODE, SET `RUN' FLAG, CHECK FOR IO SYNC
265: 
266:         MOVEI TAC,WKCODE        ; WAKE UP JOB IF PENDING ALREADY
267:         MOVEM TAC,ADCP1L
268:         HRRZ TAC,ADCRUN         ; MUST SET THIS IF TIME TO GO
269:         JUMPE TAC,ADCTSS
270:         LDB J,PJOBN
271:         SKIPN PROG,JBTADR(J)
272:         JRST ADCACK             ; ADDRESS CHECK. GIVE ERROR.
273:         HLRZ AC1,PROG
274:         CAIG TAC,(AC1)
275:         CAIG TAC,JOBPFI
276:         JRST ADCACK
277:         SETOM @ADCRUN           ; SET `RUN' FLAG
278: ADCTSS: TRNE IOS,IOSYNC         ; ARE WE TRYING TO SYNCHRONIZE?
279:         SKIPE DACBKO            ; YES, IS THE OTHER GUY RUNNING?
280:         JRST ADCTCN             ; NOT SYNCHRO OR IS RUNNING
281:         TRNE IOS,IOAFT          ; SYNC AFTER CYCLE?
282:         TRNN IOS,CYCLE          ; YES, IS HE CYCLING?
283:         JRST ADCDCS
284:         TRNN IOS,CYCDON         ; YES, IS CYCLING DONE?
285:         JRST ADCTCN             ; NO, START US UP, BUT SAVE DAC FOR LATER
286: ADCDCS: SKIPN DACNBK            ; WELL, IS HE PENDING? (BETTER BE)
287:         PUSHJ P,DACST           ; YES, START HIM UP
288:                                 ; UNDEFINED STATE HERE OF NOT PENDING
289:                                 ; PROBABLY SHOULD BE SOME KIND OF ERROR
290: ADCTCN: CONO ADC,@ADCCNO        ; START IT UP
291:         POPJ P,
292: 
293: ADCACK: MOVEI TAC,ERCODE        ; PROPAGATE ADDRESS CHECK BACK TO HIM
294:         MOVEM TAC,ADCP1L
295:         JRST ADCKL
    ADCSER page# 0009 next  prev
297: ; ADCP1 - PDP-10'S CLOCK ROUTINES FOR THE ADC
298: 
299: ADCP1: SKIPN TAC,ADCP1L
300:         POPJ P,
301:         SETZM ADCP1L
302:         MOVEI DDB,ADCDDB
303:         JRST @ADCP1D-1(TAC)
304: 
305: ADCP1D: WKM
306:         ADCERM
307: 
308: WKM:    MOVE IOS,DEVIOS(DDB)
309:         LDB J,PJOBN
310:         TLNN IOS,IOW            ; IS HE WAITING?
311:         POPJ P,                 ; NO, FORGET IT
312:         MOVSI IOS,IOW
313:         PSYNC1 <HRRZ TAC,DEVCMR(DDB)>
314:         ANDCAB IOS,DEVIOS(DDB)  ; CLEAR WAIT BIT
315:         XSYNC1 <HRRZ TAC,DEVCMR(DDB)>
316:         JRST STTIOD
317: 
318: ADCERM: SETZM ADCBKI            ; KILL ANY WAITING XFR
319: ERM:    LDB J,PJOBN
320:         MOVEI IOS,IOACT
321:         PSYNC1 <HRRZ TAC,DEVCMR(DDB)>
322:         ANDCAB IOS,DEVIOS(DDB)
323:         XSYNC1 <HRRZ TAC,DEVCMR(DDB)>
324:         PUSHJ P,TTYERP
325:         PUSHJ P,INLMES
326:         ASCIZ /
327: ILLEGAL ADDRESS FOR ADC-DAC
328: ↑C
329: ./
330:         PUSHJ P,TTYSTC
331:         JRST ESTOP              ; STOP HIM PERMANANTLY
    ADCSER page# 0010 next  prev
333: ; ADC INTERRUPT ROUTINES, ADCIST FOR SPURIOUS, ADCINT FOR NORMAL
334: 
335: ADCIST:CONO ADC,0
336:         AOS ADCSTI              ; COUNT NUMBER OF SPURIOUS INTERRUPTS
337:         JEN @ADCCHL             ; DISMISS INTERRUPT
338: 
339: ADCINT:BLKI ADC,ADCBKI         ; BRING IN NEXT WORD
340:         JRST ADCDON             ; COUNT OVERFLOW
341:         JEN @ADCCHL             ; GO BACK FOR MORE
342: 
343: ADCDON: JSR ADCSAV              ; GET US SOME ACS
344: ADCSTU: MOVEI DDB,ADCDDB
345:         CONSO ADC,ADLOST        ; DATA MISSED?
346:         JRST ADCNDM
347:         MOVEI IOS,LOST
348:         PSYNC ADCCSC            ; YES, SET LOST BIT (NOT REALLY AN ERROR)
349:         ORB IOS,ADCIOS
350:         XSYNC ADCCSC
351: ADCNDM: SKIPN TAC,ADCNBK        ; IS THERE ANOTHER XFR WAITING?
352:         JRST ADCWK              ; NO MORE, STOP ADC
353:         MOVEM TAC,ADCBKI
354:         PUSHJ P,ADCICH          ; ANY WORDS?
355:         LDB TAC,PDVTIM          ; PICK UP HUNG TIME
356:         DPB TAC,PDVCNT          ; USE THIS AS HUNG COUNT
357:         SETZM ADCNBK
358:         SKIPN ADCBKI
359:         JRST ADCSTU             ; ALL DONE (???) GO THROUGH AGAIN
360:         JRST ADCW               ; WAKE HIM UP AND LEAVE
361: 
362: ADCICH: CONSO ADC,DATARQ
363:         POPJ P,
364:         BLKI ADC,ADCBKI         ; BRING IN NEXT WORD
365:         JRST [SETZM ADCBKI      ; COUNT OVERFLOW
366:               POPJ P,]
367:         JRST ADCICH             ; OK, CHECK FOR ANOTHER ONE
    ADCSER page# 0011 next  prev
369: ; ADC INTERRUPT ROUTINES, ADCRCY FOR RECYCLING INPUT
370: 
371: ADCRCY:MOVEM TAC,ADCTAC
372:         BLKI ADC,ADCBKI         ; GET NEXT WORD
373:         JRST ADCRDN             ; COUNT OVERFLOW
374:         MOVE TAC,ADCBKI
375:         MOVM TAC,(TAC)          ; PICK UP WORD WE JUST READ IN
376:         CAMLE TAC,ADCTHR        ; IS IT GREATER THAN THRESHHOLD?
377:         JRST ADCSMD             ; YES, SWITCH MODES INTO NORMAL
378:         MOVE TAC,ADCTAC
379:         JEN @ADCCHL             ; NO, GO ON
380: 
381: ADCRDN: SKIPN TAC,ADCRCB        ; PICK UP IOWD
382:         JRST ADCILI             ; NOTHING THERE, HELP!
383:         MOVEM TAC,ADCBKI
384:         LDB TAC,[POINT 6,ADCDDB+DEVCHR,17]      ; PDVTIM
385:         DPB TAC,[POINT 6,ADCDDB+DEVCHR,11]      ; PDVCNT
386:         MOVE TAC,ADCTAC
387:         JEN @ADCCHL
    ADCSER page# 0012 next  prev
389: ; ADC INTERRUPT ROUTINES - ADCSMD, SWITCH MODES FROM CYCLE TO NORMAL
390: 
391: ADCSMD: MOVE TAC,ADCTAC
392:         JSR ADCSAV              ; GET US SOME ACS
393:         MOVEI DDB,ADCDDB
394:         LDB J,PJOBN
395:         MOVE PROG,JBTADR(J)     ; PICK UP HIS PROT-RELOC
396:         MOVEI TAC,ADCINT        ; SET TO GO TO REGULAR PLACE ON INTERRUPT
397:         HRRM TAC,ADCJMP
398:         SKIPE ADCNBK            ; IF THERE IS ANOTHER BLKI WD, THEN
399:         PUSHJ P,ADCCHK          ; CHECK FOR NEXT WORD READY
400:         MOVEI IOS,CYCDON        ; NOTE RECYCLING DONE
401:         CONSZ ADC,ADLOST        ; DATA MISSED?
402:         ORI IOS,LOST            ; YES, SET BIT
403:         PSYNC ADCCSC
404:         ORB IOS,ADCIOS
405:         XSYNC ADCCSC
406:         HRLZ AC1,PROG           ; SET AC1 TO POINT TO END OF CORE IMAGE
407:         SKIPE ADCNBK            ; IF THERE IS ANOTHER BLKI WD, THEN
408:         PUSHJ P,ADCCHK          ; CHECK FOR NEXT WORD READY
409:         HRRZ TAC,ADCRCW         ; IS THERE A PLACE TO PUT THE RECYCLE WD?
410:         JUMPE TAC,ADCISH        ; NO, GO ON WITH REGULAR XFR
411:         CAIL TAC,JOBPFI
412:         CAILE TAC,(AC1)
413:         JRST ADCILA             ; ADDRESS CHECK.
414:         MOVE TAC,ADCBKI
415:         SUBI TAC,(PROG)
416:         MOVEM TAC,@ADCRCW       ; GIVE USER THE BLKI POINTER
417:         SKIPE ADCNBK            ; IF THERE IS ANOTHER BLKO WD, THEN
418:         PUSHJ P,ADCCHK          ; CHECK FOR NEXT WORD READY
419: ADCISH: TRNE IOS,IOSYNC         ; ARE WE SYNCHRONIZING IO?
420:         TRNN IOS,IOAFT          ; IF SO, IS IT AFTER RECYCLE DONE?
421:         JRST ADCSTU             ; NO, JUST GO ON WITHOUT COMMENT
422:         SKIPE DACNBK            ; IS THERE A WAITING TRANSFER?
423:         SKIPE DACBKO            ; AND NO CURRENT TRANSFER?
424:         JRST ADCSTU
425:         SKIPE ADCNBK            ; CHECK FOR WORD READY
426:         PUSHJ P,ADCCHK          ; READ IT IN IF READY
427:         PUSHJ P,DACST           ; CALL DAC STARTUP CODE
428:         SKIPE ADCNBK            ; CHECK FOR WORD READY
429:         PUSHJ P,ADCCHK          ; READ IT IN IF READY
430:         JRST ADCSTU
431: 
432: ADCCHK: CONSO ADC,DATARQ        ; DOES IT HAVE A WORD FOR US?
433:         POPJ P,                 ; NO, FORGET IT
434:         BLKI ADC,ADCNBK         ; YES, BRING IT IN VIA NEXT PTR
435:         JRST [SETZM ADCNBK      ; NO MORE, NOTE EMPTY IOWD
436:               POPJ P,]
437:         JRST ADCCHK             ; GO BACK AND CHECK FOR MORE
    ADCSER page# 0013 next  prev
439: ; ADC INTERRUPT ROUTINES - ADCILA, ADCW, ADCWK, ADCILI, END OF XFR
440: 
441: ADCW:   MOVEI TAC,WKCODE        ; DURING XFR TO JUST WAKE UP JOB
442:         JRST ADCSTC
443: 
444: ADCWK:  MOVEI TAC,WKCODE        ; HERE AT END OF XFR TO KILL ADC AND WAKE JOB
445:         JRST ADCZ
446: 
447: ADCILI: MOVE TAC,ADCTAC         ; RESTORE SAVED AC
448:         JSR ADCSAV              ; GET US SOME ACS
449: ADCILA: MOVEI TAC,ERCODE
450:         PSYNC ADCCSC
451:         MOVEI IOS,IODERR        ; MAKE SURE NO FURTHER TRANSFERS
452:         ORM IOS,ADCIOS
453:         XSYNC ADCCSC
454: ADCZ:   SETZM ADCBKI            ; ABORT NEXT TRANSFERS
455:         SETZM ADCNBK
456:         CONO ADC,0
457:         MOVEI TAC1,ADCIST       ; MAKE SURE STRAY INTERRUPTS GET TRAPPED
458:         HRRM TAC1,ADCJMP
459:         HRRZ TAC1,ADCRUN        ; DOES HE WANT TO KNOW ABOUT THIS?
460:         JUMPE TAC1,ADCCIA       ; NO, FORGET IT
461:         LDB J,PJOBN             ; PICK UP JOB NUMBER
462:         SKIPN PROG,JBTADR(J)    ; AND PROT-RELOC FOR JOB
463:         JRST ADCCHI             ; NONE THERE. OOPS!
464:         HLRZ AC1,PROG
465:         CAIL TAC1,JOBPFI
466:         CAILE TAC1,(AC1)
467:         JRST ADCCHI
468:         SETZM @ADCRUN           ; CLEAR HIS RUNNING FLAG
469: ADCCIA: MOVEI IOS,IOACT         ; UNLOCK HIM FROM CORE
470:         PSYNC ADCCSC            ; DO THIS AFTER ADDRESS CHECK
471:         ANDCAB IOS,ADCIOS       ; ON THE OFF CHANCE THAT HE MIGHT
472:         XSYNC ADCCSC            ; HAVE DISSAPEARED IN THE INTERIM
473: ADCSTC: MOVEM TAC,ADCP1L
474:         POPJ P,
475: 
476: ADCCHI: MOVE IOS,ADCIOS
477:         SETZM ADCRUN            ; MAKE SURE WE DON'T LOOP
478:         TLNE IOS,ERRMSK
479:         JRST ADCSTC             ; JUST GET ON WITH IT
480:         JRST ADCILA             ; NO ERRORS YET, GIVE HIM ADDRESS CHECKD
    ADCSER page# 0014 next  prev
482: ; UUO DISPATCH TABLE FOR DAC
483: 
484:         JRST DACINI     ; SYSTEM STARTUP
485:         JRST DAHUNG     ; HUNG TIME OUT
486: DACDSP:JRST DACREL     ; RELEASE
487:         POPJ P,         ; CLOSE OUTPUT
488:         JRST UUOERR     ; BUFFERED OUTPUT
489:         JRST ILLINP     ; BUFFERED INPUT
490:         JRST CPOPJ1     ; ENTER
491:         JRST CPOPJ1     ; LOOKUP
492:         JRST DACOUT     ; DMP MODE OUTPUT
493:         JRST ILLINP     ; DMP MODE INPUT
494:         POPJ P,         ; USETO
495:         POPJ P,         ; USETI
496:         POPJ P,         ; UGETF
497:         JRST CPOPJ1     ; RENAME
498:         POPJ P,         ; CLOSE INPUT
499:         POPJ P,         ; UTPCLR
500:         JRST DACMTP     ; MTAPE
    ADCSER page# 0015 next  prev
502: ; DAC MTAPE UUO. SETS PARAMETERS.
503: ; EFFECTIVE ADDRESS POINTS TO TWO WORD BLOCK
504: ; FIRST WORD (RH SAME AS ADC)
505: ;       0,,SPEED*1000+PACK*100+NCHANS
506: ;       SPEED = 0       6.4 KC          IS PER CHANNEL RATE
507: ;               1       12.8 KC
508: ;               2       25.6 KC
509: ;               3       51.2 KC
510: ;               4       102.4 KC
511: ;               5       204.8 KC
512: ; SECOND WORD (SAME AS ADC)
513: ;       <ADDR FOR ERR CODES>,,<ADDR FOR `RUN' FLAG>
514: ;       <`RUN' FLAG IS `SETOM'ED WHILE DAC IS RUNNING AND ZEROED WHEN
515: ;               DAC IS SHUT OFF
516: 
517: DACMTP: TLZN IOS,IOBEG          ; FIRST UUO?
518:         JRST DACNFS
519:         MOVEM IOS,DACIOS        ; NOT BUSY BY DEFINITION (OR BUG!)
520:         PUSHJ P,DACINI          ; CLEAR OUT IMPORTANT STUFF
521: DACNFS: PUSHJ P,CHKUUO          ; ADDRESS CHECK EFFECT. ADDR. OF UUO
522:         ADDI AC2,1              ; CHECK END OF TABLE TOO
523:         CAILE AC2,(AC1)
524:         JRST ADRERR
525:         MOVE TAC,@UUO           ; PICK UP 0,,PARAMS
526:         PUSHJ P,SETCNO          ; SET UP CONO WORD IN TAC1
527:         MOVEM AC2,DACWPS        ; SAVE # WORDS PER SECOND
528:         MOVEM TAC1,DACCNO       ; STORE CONO WORD
529:         ADDI UUO,1              ; BUMP TO ERR CODE WORD
530:         MOVE AC1,@UUO
531:         HLRZM AC1,DACERA        ; SET ERROR CODE ADDRESS
532:         HRLI AC1,PROG           ; SET PROG IN INDEX FIELD
533:         MOVEM AC1,DACRUN        ; RUN FLAG ADDRESS
534:         HLLM AC1,DACERA
535:         POPJ P,                 ; ALL DONE
    ADCSER page# 0016 next  prev
537: ; DAC DUMP MODE OUTPUT ROUTINE
538: 
539: DACW:   TRNE IOS,ERRMSK
540:         POPJ P,                 ; LEAVE ON ERRORS
541:         PUSHJ P,WSYNC           ; WAIT FOR NEXT XFR DONE
542: DACOUT: TLZN IOS,IOBEG          ; FIRST UUO?
543:         JRST DACNOF
544:         MOVEM IOS,DACIOS
545:         PUSHJ P,DACINI
546: DACNOF: SKIPE DACNBK            ; IS THERE ANOTHER BLOCK WAITING?
547:         JRST DACW               ; YES, GO WAIT FOR IT
548:         PUSHJ P,CHKUUO          ; ADDR CHECK
549:         SKIPE TAC,@UUO          ; PICK UP IOWD
550:         TLNN TAC,777777         ; ANYTHING THERE?
551:         JRST ADCXIT             ; NO, EXIT NOW
552:         PUSHJ P,ADRCHK          ; ADDRESS CHECK THE IOWD
553:         JRST ADRERR             ; ILLEGAL. STOP JOB AND PRINT MESSAGE
554:         MOVE IOS,[IO,,IOACT]
555:         PSYNC DACCSC
556:         ORB IOS,DACIOS
557:         XSYNC DACCSC
558:         ADDI TAC,(PROG)
559:         MOVEM TAC,DACNBK
560:         HLRO AC1,TAC            ; PICK UP -WC
561:         MOVN AC1,AC1            ; MAKE IT POSITIVE
562:         IDIV AC1,DACWPS         ; MAKE INTO # SECONDS
563:         ADDI AC1,5              ; 5 MORE FOR GOOD MEASURE
564:         CAILE AC1,77            ; SATURATE AT 6 BITS
565:         MOVEI AC1,77
566:         DPB AC1,PDVTIM          ; AND THIS IS THE NEW HUNG TIME
567:         SKIPE DACBKO            ; IS THERE AN XFR IN PROGRESS?
568:         JRST ADCXIT             ; YES, WE CAN LEAVE NOW
569:         TRNE IOS,IOSYNC         ; ARE WE SYNCHRONIZING?
570:         SKIPE ADCBKI            ; YES, IS ADC ALREADY RUNNING?
571:         JRST DACSTR             ; NOT SYNC OR XFR ALREADY RUNNING
572:         SKIPN ADCNBK            ; NOT RUNNING, XFR QUEUED?
573:         JRST ADCSHT             ; NOT QUEUED, WAIT FOR IT. SET HUNG TIME TO MAX.
574: DACSTR: MOVEI TAC,STCODE        ; START DAC AND LEAVE
575:         MOVEM TAC,DACP2L        ; PLACE WHERE P2 WILL SEE IT
576:         JRST ADCXIT             ; LEAVE, WAIT OR NO
    ADCSER page# 0017 next  prev
578: ; DAC HUNG ROUTINE, DAHUNG, DAC INITIALIZE ROUTINE, DACINI, RELEASE, DACREL
579: 
580: DAHUNG: SKIPN ADCNOH            ; IF DEBUGGING, DON'T CLEAR OUT DAC YET
581: DACREL: PUSHJ P,DACCLR
582:         MOVEI DDB,DACDDB
583:         JRST HUNG               ; COMMON ROUTINE FOR ADC-DAC
584: 
585: DACCLR: MOVEI TAC,KLCODE
586:         MOVEM TAC,DACP2L        ; TELL P2 TO CLEAR DAC
587:         JRST DACJST
    ADCSER page# 0018 next  prev
589: ; DACP2 - PDP-6'S CLK LEVEL ROUTINE FOR THE DAC
590: 
591: DACP2: SKIPN TAC,DACP2L
592:         POPJ P,
593:         SETZM DACP2L
594:         JRST @P2DDSP-1(TAC)
595: 
596: P2DDSP: DACST           ; STARTUP
597:         DACKL           ; KILL
598: 
599: DACKL:  CONO DAC,0
600: DACINI: SETZM DACZB
601:         MOVE TAC,[XWD DACZB,DACZB+1]
602:         BLT TAC,DACZND-1
603: DACJST: MOVEI TAC,DACIST
604:         HRRM TAC,DACJMP
605:         POPJ P,
606: 
607: DACST:  MOVEI DDB,DACDDB
608:         CONO DCB,200000         ; KILL OLD AD IF RUNNING
609:         CONO AD,4000            ; OTHERWISE, WILL LOOP IN P2CH1
610:         MOVSI TAC,(<JFCL>)
611:         HLLM TAC,ADJMP          ; KILL JUMP TO OLD AD ROUTINES
612:         MOVE TAC,[JSR DACCHL]   ; MAKE SURE CHAN LOC IS SET UP RIGHT
613:         MOVEM TAC,40+<DACCHN*2>
614:         CONO PI,DACON           ; MAKE SURE SOMEBODY'S LISTNING
615:         SKIPN TAC,DACNBK
616:         JRST DACKL
617:         LDB TAC1,PDVTIM         ; START COUNTING NOW
618:         DPB TAC1,PDVCNT
619:         MOVEM TAC,DACBKO        ; THIS SET PREVENTS LOOPING THROUGH ADCST
620:         SETZM DACNBK
621:         MOVEI TAC,DACINT        ; IT IS A NORMAL INTERRUPT
622:         MOVE IOS,DACIOS
623:         HRRM TAC,DACJMP         ; SET JUMP LOCATION
624:         MOVEI TAC,WKCODE        ; WAKE UP JOB IF PENDING ALREADY
625:         MOVEM TAC,DACP1L
626:         HRRZ TAC,DACRUN         ; SEE IF HE WANTS US TO FLAG HIM
627:         JUMPE TAC,DACTSS        ; NO, PROCEED
628:         LDB J,PJOBN
629:         SKIPN PROG,JBTADR(J)
630:         JRST DACACK             ; ADDRESS CHECK. GIVE ERROR.
631:         HLRZ AC1,PROG
632:         CAIG TAC,(AC1)
633:         CAIG TAC,JOBPFI
634:         JRST DACACK
635:         SETOM @DACRUN           ; SET `RUN' FLAG
636: DACTSS: TRNE IOS,IOSYNC         ; ARE WE TRYING TO SYNCHRONIZE?
637:         SKIPE ADCBKI            ; YES, IS THE OTHER GUY RUNNING?
638:         JRST DACTCN             ; NOT SYNCHRO OR IS RUNNING
639:         SKIPN ADCNBK            ; WELL, IS HE PENDING? (BETTER BE)
640:         PUSHJ P,ADCST           ; YES, START HIM UP
641:                                 ; UNDEFINED STATE HERE OF NOT PENDING
642:                                 ; PROBABLY SHOULD BE SOME KIND OF ERROR
643: DACTCN: CONO DAC,@DACCNO        ; START IT UP
644:         POPJ P,
645: 
646: DACACK: MOVEI TAC,ERCODE        ; SEND HIM BACK AN ADDRESS CHECK
647:         MOVEM TAC,DACP1L
648:         JRST DACKL
    ADCSER page# 0019 next  prev
650: ; DACP1 - PDP-10'S CLOCK ROUTINES FOR THE DAC
651: 
652: DACP1: SKIPN TAC,DACP1L
653:         POPJ P,                 ; SHOULDN'T HAPPEN
654:         SETZM DACP1L
655:         MOVEI DDB,DACDDB
656:         JRST @DACP1D-1(TAC)
657: 
658: DACP1D: WKM
659:         DACERM
660: 
661: DACERM: SETZM DACBKO            ; KILL WAITING XFR
662:         JRST ERM
    ADCSER page# 0020 next  prev
664: ; DAC INTERRUPT ROUTINES, DACIST FOR SPURIOUS, DACINT FOR NORMAL
665: 
666: DACIST:CONO DAC,0
667:         AOS DACSTI              ; COUNT NUMBER OF SPURIOUS INTERRUPTS
668:         JEN @DACCHL
669: 
670: DACINT: BLKO DAC,DACBKO         ; SEND OUT NEXT WORD
671:         JRST DACDON             ; COUNT OVERFLOW
672:         JEN @DACCHL             ; GO BACK FOR MORE
673: 
674: DACDON: JSR DACSAV
675:         MOVEI DDB,DACDDB
676:         CONSO DAC,DALOST        ; DATA MISSED?
677:         JRST DACNDM
678:         MOVEI IOS,LOST
679:         PSYNC DACCSC
680:         ORB IOS,DACIOS
681:         XSYNC DACCSC
682: DACNDM: SKIPN TAC,DACNBK        ; ANOTHER ONE WAITING?
683:         JRST DACWK              ; NO MORE. WAKE UP USER AND LEAVE.
684:         MOVEM TAC,DACBKO
685:         PUSHJ P,DACCHK
686:         LDB TAC,PDVTIM
687:         DPB TAC,PDVCNT          ; RESET HUNG TIME
688:         SETZM DACNBK
689:         SKIPN DACBKO
690:         JRST DACWK              ; IF OVERFLOWED IN MEANTIME, FLUSH XFR NOW
691:         MOVEI TAC,WKCODE        ; SET TO WAKE HIM UP (CHECKS IOW IN P1)
692:         JRST DACSTC
693: 
694: DACCHK: CONSO DAC,INTRQ         ; REQUESTING INTERRUPT?
695:         POPJ P,                 ; NO, FORGET IT
696:         BLKO DAC,DACBKO         ; YES, SEND OUT NEXT WORD
697:         JRST [SETZM DACBKO      ; FLAG OVERFLOW
698:               POPJ P,]
699:         JRST DACCHK             ; SUCCESS, LOOP BACK FOR NEXT WORD
    ADCSER page# 0021 next  prev
701: ; DAC INTERRUPT ROUTINES - WAKEUP AND `RUN' FLAG BUSINESS
702: 
703: DACWK:  MOVEI TAC,WKCODE
704: DACZ:   SETZM DACBKO
705:         SETZM DACNBK
706:         CONO DAC,0
707:         MOVEI TAC1,DACIST
708:         HRRM TAC1,DACJMP
709:         HRRZ TAC1,DACRUN
710:         JUMPE TAC1,DACCIA
711:         LDB J,PJOBN             ; PICK UP JOB NUMBER
712:         SKIPN PROG,JBTADR(J)    ; AND PROT-RELOC OF JOB
713:         JRST DACCIA             ; NONE THERE!! OOPS!
714:         HLRZ AC1,PROG
715:         CAIL TAC1,JOBPFI
716:         CAILE TAC1,(AC1)
717:         JRST DACCHI
718:         SETZM @DACRUN
719: DACCIA: MOVEI IOS,IOACT         ; UNLOCK JOB
720:         PSYNC DACCSC
721:         ANDCAB IOS,DACIOS
722:         XSYNC DACCSC
723: DACSTC: MOVEM TAC,DACP1L
724:         POPJ P,
725: 
726: DACCHI: MOVE IOS,DACIOS
727:         SETZM DACRUN
728:         TLNE IOS,ERRMSK
729:         JRST DACSTC
730:         MOVEI TAC,ERCODE
731:         PSYNC DACCSC
732:         MOVEI IOS,IODERR
733:         ORM IOS,DACIOS
734:         XSYNC DACCSC
735:         JRST DACZ
    ADCSER page# 0022 next  prev
737: ; ROUTINE MAKES UP A CONO WORD FROM MTAPE SPECS
738: ; SPECS ARE IN RH TAC
739: ; RETURNS CONO WORD IN TAC1
740: ; USES AC1, AC3 AS TEMP
741: ; RETURNS WORDS PER SECOND IN AC2
742: ; = SPEED*1000+PACK*100+NCHANS
743: ; NCHANS = 1 FOR MONO   (2-BIT NUMBER)
744: ;        = 2 FOR STEREO
745: ;        = 0,3 FOR QUAD
746: ; PACK = 0,3 FOR 12 BIT  (2-BIT NUMBER)
747: ;      = 1 FOR 16 BIT (HALFWORD MODE)
748: ;      = 2 FOR FLOATING PT. INCREMENTAL
749: ; SPEED = 0 FOR 6.4 KC  (3-BIT NUMBER)
750: ;       = 1 FOR 12.8 KC
751: ;       = 2 FOR 25.6 KC
752: ;       = 3 FOR 51.2 KC
753: ;       = 4 FOR 102.4 KC
754: ;       = 5 FOR 204.8 KC
755: 
756: SETCNO: MOVEI TAC1,QUAD!RUNB!ADCCHN     ; ADC AND DAC RUN ON SAME CHANNEL
757:         LDB AC1,[POINT 2,TAC,35]
758:         CAIN AC1,1
759:         XORI TAC1,MONO!QUAD
760:         CAIN AC1,2
761:         XORI TAC1,STEREO!QUAD
762:         LDB AC1,[POINT 2,TAC,29]
763:         MOVE AC3,SAMPW(AC1)     ; PICK UP # SAMPS PER WD
764:         ORI TAC1,.12BIT
765:         CAIN AC1,1
766:         XORI TAC1,.12BIT!.16BIT
767:         CAIN AC1,2
768:         XORI TAC1,.12BIT!FLOAT
769:         LDB AC1,[POINT 3,TAC,26]
770:         CAIN AC1,1
771:         ORI TAC1,1*FILT
772:         CAIN AC1,2
773:         ORI TAC1,2*FILT
774:         CAIL AC1,3
775:         ORI TAC1,3*FILT
776:         TRNE TAC1,STEREO
777:         ADDI AC1,1
778:         TRNE TAC1,QUAD
779:         ADDI AC1,2
780:         CAILE AC1,5
781:         JRST ILLSPD
782:         MOVE AC2,SPTAB(AC1)     ; PICK UP SPEED IN SAMPLES/SEC
783:         IDIVI AC2,(AC3)         ; GET WDS/SEC IN AC2
784:         DPB AC1,[POINT 3,TAC1,29]
785:         POPJ P,
786: 
787: ILLSPD: JSP TAC,UUOMES
788:         ASCIZ /
789: ILLEGAL SPEED PARAMETER FOR AD-DA
790: UUO/
791: 
792: SAMPW:  3243
793: SPTAB:  =6400=12800=25600=51200=102400=204800
    ADCSER page# 0023 next  prev
795: ; ADRCHK - ROUTINE TO ADDRESS CHECK AN IOWD, CHKUUO - CHECKS UUO ADDR
796: ; CALL WITH IOWD IN TAC
797: ; SKIPS IF OK
798: ; PROG MUST BE SET UP
799: ; USES TAC1 AND AC1
800: 
801: ADRCHK: MOVEI TAC1,(TAC)
802:         HLRZ AC1,PROG
803:         CAIL TAC1,JOBPFI        ; MUST BE ABOVE PROTECTED AREA
804:         CAILE TAC1,(AC1)
805:         POPJ P,                 ; OUT OF BOUNDS, GIVE ERROR RETURN
806:         HLRO TAC1,TAC
807:         MOVNS TAC1              ; MAKE IT POSITIVE
808:         ADDI TAC1,(TAC)
809:         CAIL TAC1,JOBPFI
810:         CAILE TAC1,(AC1)
811:         POPJ P,
812:         JRST CPOPJ1
813: 
814: ; CHKUUO
815: ; DOESN'T RETURN IF BAD
816: ; PROG MUST BE SET UP
817: ; PUTS RH OF UUO IN AC2
818: ; PUTS LAST WD IN CORE IMAGE ADDRESS IN AC1
819: 
820: CHKUUO: HLRZ AC1,PROG
821:         MOVEI AC2,(UUO)
822:         CAIG AC2,(AC1)
823:         CAIG AC2,JOBPFI
824:         JRST ADRERR
825:         POPJ P,
    ADCSER page# 0024 next  prev
827: ; END OF IT ALL
828: 
829: BEND ADCSER
 EOF: ADCSER end-of-file. cnt=23